package TwentyOne.Class.Abstract;

/*
 * 定义类Shape，用来表示一般二维图形。
 * Shape具有抽象方法area和perimeter，分别用来计算形状的面积和周长。
 * 试定义一些二维形状类（如矩形、三角形、圆形、椭圆形等），
 * 这些类均为Shape类的子类。
 */
abstract class AbstractShape {

    public abstract double area();

    public abstract double perimeter();
}

class Circular extends AbstractShape {

    private double radius;

    public Circular(double radius) {
        this.radius = radius;
    }

    public double area() {
        return 3.1415926 * this.radius * this.radius;
    }

    public double perimeter() {
        return 2 * 3.1415926 * this.radius;
    }
}

class Rectangle extends AbstractShape {

    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    public double area() {
        return this.length * this.width;
    }

    public double perimeter() {
        return 2 * (this.length + this.width);
    }
}

class Factory {

    public static AbstractShape getInstance(String className, double ... args) {
        if ("Circular".equalsIgnoreCase(className)) {
            return new Circular(args[0]);
        } else if ("Rectangle".equalsIgnoreCase(className)) {
            return new Rectangle(args[0], args[1]);
        } else {
            return null;
        }
    }
}

public class a19_Shape {

    public static void main(String[] args) {
        AbstractShape ase = Factory.getInstance("Circular", 1.1);
        AbstractShape asb = Factory.getInstance("Rectangle", 1.5, 10.2);
        System.out.println("圆形面积：" + ase.area() + "、圆形周长：" + ase.perimeter());
        System.out.println("矩形面积：" + asb.area() + "、矩形周长：" + asb.perimeter());
    }
}
